﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
public partial class Default3 : System.Web.UI.Page
{


    //Creo un objeto DataTable que representará una tabla con el nombre Tabla1 para factura
    private static DataTable table = new DataTable("Tabla1");
    private static DataRow fila;
    private static int indice_seleccionado;
    private static int tamano_tabla=0;

    //Creo un objeto DataTable que representará una tabla con el nombre Tabla2 para pagos
    private static DataTable table_pagos = new DataTable("Tabla2");
    private static DataRow fila_pagos;
    private static int indice_seleccionado_pagos;
    private static int tamano_tabla_pagos = 0;

    private static int contador = 0;
    private static int contador2 = 0;
    private static int numero_factura;
    private static int valor_restante_a_pagar = 1;
    private static int total_a_pagar;
    private static int monto_pagado = 0;



    protected void Page_Load(object sender, EventArgs e)
    {
        imgbt_Clientes.Attributes.Add("OnClick", "javascript:popUpClientes();");
        imgbt_Producto.Attributes.Add("OnClick", "javascript:popUpProductos();");
        lb_Fecha.Text = System.DateTime.Now.ToString();

        //Si la factura no se ha guardado todavia. Averigua el siguiente codigo de factura
        if (contador2==0)
        {
            String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection conexion5 = new SqlConnection(cadena);
            try
            {
                conexion5.Open();
                SqlCommand Cod_Factura = new SqlCommand();
                Cod_Factura.CommandText = "select coalesce(max(cod_factura),0)+1 from factura";
                Cod_Factura.Connection = conexion5;
                Cod_Factura.CommandType = CommandType.Text;
                SqlDataReader read1 = Cod_Factura.ExecuteReader();
                read1.Read();
                numero_factura = Convert.ToInt32(read1.GetValue(0).ToString());
                txt_numero_factura.Text = read1.GetValue(0).ToString();
            }
            catch (Exception error)
            {
                Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
            }
            finally
            {
                conexion5.Close();
            }
            contador2 = 1;
            lb_Estado.Text = "Activo";
            lb_FacturaGuardada.Text = "no";
        }

    }

    public void guardar_factura_cabecera()
    {

        String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conexion = new SqlConnection(cadena);
        conexion.Open();
        try
        {
            SqlCommand comando = new SqlCommand();
            comando.Connection = conexion;
            comando.CommandType = System.Data.CommandType.StoredProcedure;
            comando.CommandText = "insertar_factura";
            comando.Parameters.AddWithValue("@cod_cliente", txt_cod_cliente.Text);
            comando.Parameters.AddWithValue("@cod_funcionario", 1);
            SqlDataReader reader = comando.ExecuteReader();

        }
        catch (Exception error)
        {
            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");

        }
        finally
        {
            conexion.Close();
        }
    }


    protected void imgbt_agregar_producto_Click(object sender, ImageClickEventArgs e)
    {
        if (txt_cod_cliente.Text == "")
        {
            lb_Error_Producto.Visible = true;
            lb_Error_Texto.Visible = true;
        } if (txt_cantidadTex.Text == "")
        {
            lb_Error_Cantidad.Visible = true;
            lb_Error_Texto.Visible = true;
        }
        if (txt_cod_producto.Text != "" && txt_cantidadTex.Text != "")
        {
 

            fila = table.NewRow();
            if (tamano_tabla == 0)
            {
                table.Columns.Clear();
                table.Clear();
                DataColumn column1 = new DataColumn();
                DataColumn column2 = new DataColumn();
                DataColumn column3 = new DataColumn();
                DataColumn column4 = new DataColumn();
                
                column1.ColumnName = "Codigo ";
                column2.ColumnName = "Producto ";
                column3.ColumnName = "Cantidad ";
                column4.ColumnName = "Total";
                

                column1.DataType = System.Type.GetType("System.Int32");
                column2.DataType = System.Type.GetType("System.String");
                column3.DataType = System.Type.GetType("System.Int32");
                column4.DataType = System.Type.GetType("System.Int32");
                

                table.Columns.Add(column1);
                table.Columns.Add(column2);
                table.Columns.Add(column3);
                table.Columns.Add(column4);    
            }
            
                //cargarFilas
                fila["Codigo "] = System.Int32.Parse(txt_cod_producto.Text);
                fila["Producto "] = txt_nombre_Producto.Text;
                fila["Cantidad "] = System.Int32.Parse(txt_cantidadTex.Text);
                fila["Total"] = System.Int32.Parse(txt_cantidadTex.Text) *
                    System.Int32.Parse(txt_precio_producto.Text);
                table.Rows.Add(fila);
            tamano_tabla = tamano_tabla + 1;
            limpiar_campos_producto();
            GView_Detalle_Factura.DataSource = table;
            GView_Detalle_Factura.DataBind();
            lb_Error_Cantidad.Visible = false;
            lb_Error_Producto.Visible = false;
            lb_Error_Texto.Visible = false;
        }

    }

    protected void guardarFactura()
    {
        if (contador==0)
        {
            if (txt_cod_cliente.Text == "")
            {
                lb_Error_Cliente.Visible = true;
                lb_Error_Texto.Visible = true;
            }
            else
            {
                if (tamano_tabla > 0)
                {
                    guardar_factura_cabecera();
                    int temp = tamano_tabla - 1;
                    int pos_tem = 0;
                    String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                    SqlConnection conexion = new SqlConnection(cadena);
                    while (temp != -1)
                    {
                        //Aqui se agrega el producto

                        try
                        {
                            conexion.Open();
                            //Insertar un detalle
                            SqlCommand command = new SqlCommand("insertar_factura_detalle", conexion);
                            command.CommandType = System.Data.CommandType.StoredProcedure;
                            command.Parameters.AddWithValue("@cod_factura", numero_factura);
                            command.Parameters.AddWithValue("@cantidad", Convert.ToInt32(table.Rows[pos_tem][2].ToString()));
                            command.Parameters.AddWithValue("@cod_producto", Convert.ToInt32(table.Rows[pos_tem][0].ToString()));
                            SqlDataReader reader = command.ExecuteReader();
                            reader.Close();
                        }
                        catch (Exception error)
                        {
                            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
                        }
                        finally
                        {
                            conexion.Close();
                        }
                        pos_tem = pos_tem + 1;
                        temp = temp - 1;
                    }

                    tamano_tabla = 0;
                    lb_Error_Cliente.Visible = false;
                    lb_Error_Texto.Visible = false;
                }
            }
        }
    }

    public void total_a_pagar_factura()
    {

        int temp = tamano_tabla - 1;
        int pos_tem = 0;
        int monto_a_pagar = 0;
        while (temp != -1) {
            monto_a_pagar = monto_a_pagar + (Convert.ToInt32(table.Rows[pos_tem][3].ToString()));
            pos_tem = pos_tem + 1;
            temp = temp - 1;
        }
        total_a_pagar = monto_a_pagar;
        valor_restante_a_pagar = total_a_pagar;
        txt_total_a_pagar.Text = Convert.ToString(total_a_pagar);
        txt_valor_restante.Text = Convert.ToString(total_a_pagar);
    }
    protected void imgbt_guardar_factura_Click(object sender, ImageClickEventArgs e)
    {
        Td_guardar_factura.Visible = false;
        tb_pagos.Visible = true;
        imgbt_agregar_producto.Visible = false;
        total_a_pagar_factura();
    }

    private int total_pagado() { 
        int temp = tamano_tabla_pagos-1;
        int pos_tem=0;
        monto_pagado=0;
        while(temp!=-1){
            monto_pagado=monto_pagado + Convert.ToInt32(table_pagos.Rows[pos_tem][3].ToString());
            pos_tem = pos_tem + 1;
            temp = temp - 1;
        }
        return monto_pagado;
    }
    protected void compararDeuda(int suma)
    {
        valor_restante_a_pagar = (total_a_pagar + suma) - total_pagado();
        txt_valor_restante.Text = Convert.ToString(valor_restante_a_pagar);
    }

    private void guardarCabereraPagos()
    {
        String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conexion = new SqlConnection(cadena);
        try
        {

            SqlCommand comando = new SqlCommand();
            conexion.Open();
            comando.Connection = conexion;
            comando.CommandType = System.Data.CommandType.StoredProcedure;
            comando.CommandText = "insertar_pagos";
            comando.Parameters.AddWithValue("@cod_factura", numero_factura);
            SqlDataReader reader = comando.ExecuteReader();
            reader.Close();
        }
        catch (Exception error)
        {
            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
        }
        finally
        {
            conexion.Close();
        }

    }
    public void limpiar_campos_pagos()
    {
        txt_monto.Text = "";
        txt_numero_cuenta.Text = "";
        txt_cuenta_bancaria.Text = "";
    }

    protected void guardar_pagos()
    {
        String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conexion = new SqlConnection(cadena);
        SqlConnection conexion2 = new SqlConnection(cadena);
        try
        {
            SqlCommand Cod_Pagos = new SqlCommand();
            conexion2.Open();

            Cod_Pagos.CommandText = "select coalesce(max(cod_pagos),0) from pagos";
            Cod_Pagos.Connection = conexion2;
            Cod_Pagos.CommandType = CommandType.Text;
            SqlDataReader read2 = Cod_Pagos.ExecuteReader();
            read2.Read();
            lb_numero_pago.Text = read2.GetValue(0).ToString();

            int temp = tamano_tabla_pagos-1;
            int pos_tem=0;
            while (temp != -1)
            {

                conexion.Open();
                //Insertar un detalle
                SqlCommand comando = new SqlCommand("insertar_factura_detalle", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;
                comando.CommandText = "insertar_pagos_detalles";
                comando.Parameters.AddWithValue("@cod_pagos", Convert.ToInt32(lb_numero_pago.Text));
                comando.Parameters.AddWithValue("@cod_forma_de_pago", table_pagos.Rows[pos_tem][0].ToString());
                comando.Parameters.AddWithValue("@numero", table_pagos.Rows[pos_tem][1].ToString());
                comando.Parameters.AddWithValue("@cuenta", table_pagos.Rows[pos_tem][2].ToString());
                comando.Parameters.AddWithValue("@cantidad", table_pagos.Rows[pos_tem][3].ToString());
                SqlDataReader reader = comando.ExecuteReader();
                reader.Close();
                conexion.Close();
                pos_tem = pos_tem + 1;
                temp = temp - 1;
            }
        }
        catch (Exception error)
        {
            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
        }
        finally
        {
            conexion2.Close();
        }
    }

    protected void imgbt_finalizar_Pago_Click(object sender, ImageClickEventArgs e)
    {
        if (valor_restante_a_pagar > 0)
        {
            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta('No se ha realizado en su totalidad el pago de la factura') </SCRIPT>");
            tb_pagos.Visible = true;
            compararDeuda(0);
            GView_Detalle_Factura.DataSource = table;
            GView_Detalle_Factura.DataBind();
        }
        else
        {
            if (tamano_tabla > 0)
            {
                lb_Estado.Text = "Activo";
                guardarFactura();
                guardarCabereraPagos();
                guardar_pagos();
                contador = 0;
                table.Columns.Clear();
                table.Clear();
                table_pagos.Columns.Clear();
                table_pagos.Clear();
                GridView_pagos.DataSource = table_pagos;
                GridView_pagos.DataBind();
                GView_Detalle_Factura.DataSource = table;
                GView_Detalle_Factura.DataBind();
                tamano_tabla = 0;
                tamano_tabla_pagos = 0;
                imgbt_agregar_producto.Visible = true;
                tr_guardar_producto.Visible = false;
                tb_pagos.Visible = false;
                lb_Estado.Text = "Finalizado";
                txt_cod_cliente.Text = "";
                txt_nombre_cliente.Text = "";
                txt_total_a_pagar.Text = "";
                contador2 = 0;
                limpiar_campos_pagos();
                Page.RegisterStartupScript("alerta", "<SCRIPT> alerta('Se ha realizado con exito la factura') </SCRIPT>");
            }
        }
    }
    protected void imgbt_agregar_Pago_Click(object sender, ImageClickEventArgs e)
    {
        if (txt_monto.Text != "")
        {

            if (valor_restante_a_pagar < Convert.ToInt32(txt_monto.Text))
            {

                Page.RegisterStartupScript("alerta", "<SCRIPT> alerta('El valor supera al importe de la factura') </SCRIPT>");
            }
            else
            {

                fila_pagos = table_pagos.NewRow();
                if (tamano_tabla_pagos == 0)
                {
                    table_pagos.Columns.Clear();
                    table_pagos.Clear();
                    DataColumn forma = new DataColumn();
                    DataColumn cuenta = new DataColumn();
                    DataColumn numero = new DataColumn();
                    DataColumn monto = new DataColumn();

                    forma.ColumnName = "Forma De Pago ";
                    cuenta.ColumnName = "Cuenta Bancaria ";
                    numero.ColumnName = "Numero ";
                    monto.ColumnName = "Monto";


                    forma.DataType = System.Type.GetType("System.String");
                    cuenta.DataType = System.Type.GetType("System.String");
                    numero.DataType = System.Type.GetType("System.String");
                    monto.DataType = System.Type.GetType("System.String");


                    table_pagos.Columns.Add(forma);
                    table_pagos.Columns.Add(cuenta);
                    table_pagos.Columns.Add(numero);
                    table_pagos.Columns.Add(monto);
                }

                //cargarFilas
                fila_pagos["Forma De Pago "] = dl_forma_de_pago.Text;
                fila_pagos["Cuenta Bancaria "] = txt_cuenta_bancaria.Text;
                fila_pagos["Numero "] = txt_numero_cuenta.Text;
                fila_pagos["Monto"] = txt_monto.Text;
                table_pagos.Rows.Add(fila_pagos);
                GridView_pagos.DataSource = table_pagos;
                GridView_pagos.DataBind();
                tamano_tabla_pagos = tamano_tabla_pagos + 1;
                compararDeuda(0);
                limpiar_campos_pagos();
            }
        }
    }

    private void limpiar_campos_producto()
    {
        txt_nombre_Producto.Text = "";
        txt_cantidadTex.Text = "";
        txt_precio_producto.Text = "";
        txt_cod_producto.Text = "";
    }
 


    protected void imgbt_cancelar_factura_Click(object sender, ImageClickEventArgs e)
    {
        limpiar_campos_producto();
        txt_nombre_cliente.Text = "";
        txt_cod_cliente.Text = "";
        table.Columns.Clear();
        table.Clear();
        contador = 0;
    }

    protected void GridViewf_OnRowCommand(Object sender, GridViewCommandEventArgs e)
    {
        GView_Detalle_Factura.SelectedIndex = Convert.ToInt32(e.CommandArgument);
        indice_seleccionado = GView_Detalle_Factura.SelectedIndex;
        if (e.CommandName == "editar")
        {
            txt_cod_producto.Text = GView_Detalle_Factura.SelectedRow.Cells[2].Text;
            txt_nombre_Producto.Text = GView_Detalle_Factura.SelectedRow.Cells[3].Text;
            txt_cantidadTex.Text = GView_Detalle_Factura.SelectedRow.Cells[4].Text;
            txt_precio_producto.Text =Convert.ToString(Convert.ToInt32
                (GView_Detalle_Factura.SelectedRow.Cells[5].Text)/
                (Convert.ToInt32(txt_cantidadTex.Text)));
            bt_guardar_editado.Visible = true;
        }
        if (e.CommandName == "borrar")
        {
            table.Rows[indice_seleccionado].Delete();
            GView_Detalle_Factura.DataSource = table;
            GView_Detalle_Factura.DataBind();
            tamano_tabla = tamano_tabla - 1;
        }
    }


    protected void bt_guardar_editado_Click(object sender, EventArgs e)
    {

            table.AcceptChanges();
            table.Rows[indice_seleccionado].BeginEdit();
            table.Rows[indice_seleccionado][0] = txt_cod_producto.Text;
            table.Rows[indice_seleccionado][1] = txt_nombre_Producto.Text;
            table.Rows[indice_seleccionado][2] = txt_cantidadTex.Text;
            table.Rows[indice_seleccionado][3] = Convert.ToString(Convert.ToInt32(txt_precio_producto.Text)*Convert.ToInt32(txt_cantidadTex.Text));
            table.Rows[indice_seleccionado].EndEdit();
      
            limpiar_campos_producto();
            bt_guardar_editado.Visible = false;
            GView_Detalle_Factura.DataSource = table;
            GView_Detalle_Factura.DataBind();
        
    }

    protected void GridPagos_OnRowCommand(Object sender, GridViewCommandEventArgs e)
    {
        GridView_pagos.SelectedIndex = Convert.ToInt32(e.CommandArgument);
        indice_seleccionado_pagos = GridView_pagos.SelectedIndex;
        if (e.CommandName == "editar_pagos")
        {
            dl_forma_de_pago.Text = GridView_pagos.SelectedRow.Cells[2].Text;
            txt_cuenta_bancaria.Text = GridView_pagos.SelectedRow.Cells[3].Text;
            txt_numero_cuenta.Text = GridView_pagos.SelectedRow.Cells[4].Text;
            txt_monto.Text = GridView_pagos.SelectedRow.Cells[5].Text;
            bt_editar_pagos.Visible = true;
            imgbt_agregar_Pago.Visible = false;
            imgbt_finalizar_Pago.Visible = false;
            compararDeuda(Convert.ToInt32(GridView_pagos.SelectedRow.Cells[5].Text));
        }
        if (e.CommandName == "borrar_pagos")
        {
            table_pagos.Rows[indice_seleccionado_pagos].Delete();
            GridView_pagos.DataSource = table_pagos;
            GridView_pagos.DataBind();
            tamano_tabla_pagos = tamano_tabla_pagos - 1;
            compararDeuda(0);
        }
    }

    protected void bt_editar_pagos_Click(object sender, EventArgs e)
    {
        table_pagos.AcceptChanges();
        table_pagos.Rows[indice_seleccionado_pagos].BeginEdit();
        table_pagos.Rows[indice_seleccionado_pagos][0] = dl_forma_de_pago.Text;
        table_pagos.Rows[indice_seleccionado_pagos][1] = txt_cuenta_bancaria.Text;
        table_pagos.Rows[indice_seleccionado_pagos][2] = txt_numero_cuenta.Text;
        table_pagos.Rows[indice_seleccionado_pagos][3] = txt_monto.Text;
        table_pagos.Rows[indice_seleccionado_pagos].EndEdit();
        compararDeuda(0);
        limpiar_campos_pagos();
        bt_editar_pagos.Visible = false;
        imgbt_finalizar_Pago.Visible = true;
        imgbt_agregar_Pago.Visible = true;
        GridView_pagos.DataSource = table_pagos;
        GridView_pagos.DataBind();
    }
}
